Projet R

Camille Moinier

1. Mise en place du projet

Lecture des tableaux de données

Dans un premier temps, nous allons ajouter les données nécessaires au projet grâce à la commande “read.csv”. Nous allons donc insérer les fichiers contenant l’ensemble des codes APE propres aux commerces ainsi que l’extrait de la base Sirène du département 42. Il est à noter qu’au préalable, un projet R a été créé afin de définir le répertoire de travail, pour éviter d’indiquer le chemin d’accès de tous les fichiers. En insérant les fichiers, nous leur donnont un nom plus court.

data42 = read.csv("geo_siret_42.csv")
APE_type = read.csv("APE_Type.csv")
Tableau des catégories APE
Code Type TypeAbreg
10.1 Transformation et conservation de la viande et préparation de produits à base de viande viande
10.2 Transformation et conservation de poisson, de crustacés et de mollusques poisson

Voici les 5 premières lignes de la table APE_type, qui montre la correspondance entre le code APE, le nom complet de la catégorie ainsi qu’un nom plus générique.

Classification des commerces de la Loire

Nous allons ensuite, dans un second temps, utiliser les données des entreprises de la Loire (42) insérées principalement afin d’en présenter quelques données statistiques. Par exemple, le nombre de boulangeries peut être calculé en “comptant” le nombre d’occurences du mot “BOULANGERIE” dans la colonne indiquant les noms des établissements.

sum(str_count(data42$enseigne1Etablissement, pattern = "BOULANGERIE"))
## [1] 84

Le résultat est donc un total de 84 boulangeries dans le 42.

Nous allons ensuite modifier les données de ce tableau afin de mieux les faire correspondre à celles présentes dans APE_type, pour une future jointure. Pour cela, nous allons transformer le “code activité” afin de ne garder que les 4 premiers caractères. La fonction “subset” de la librairie “stringr” est tout à fait indiquée pour cette manipulation puisqu’elle permet de ne garder qu’un certain nombre de caractères d’une colonne existante (ici les caractères 1 à 4 de “activitePrincipaleEtablissement” contenant les codes). Ce nouveau code est stocké dans une nouvelle colonne, de data42, la colonne “Code”.

data42$Code = str_sub(data42$activitePrincipaleEtablissement,start=1,end=4)
Nouveaux codes APE
siren nic siret statutDiffusionEtablissement dateCreationEtablissement trancheEffectifsEtablissement anneeEffectifsEtablissement activitePrincipaleRegistreMetiersEtablissement dateDernierTraitementEtablissement etablissementSiege nombrePeriodesEtablissement complementAdresseEtablissement numeroVoieEtablissement indiceRepetitionEtablissement typeVoieEtablissement libelleVoieEtablissement codePostalEtablissement libelleCommuneEtablissement libelleCommuneEtrangerEtablissement distributionSpecialeEtablissement codeCommuneEtablissement codeCedexEtablissement libelleCedexEtablissement codePaysEtrangerEtablissement libellePaysEtrangerEtablissement complementAdresse2Etablissement numeroVoie2Etablissement indiceRepetition2Etablissement typeVoie2Etablissement libelleVoie2Etablissement codePostal2Etablissement libelleCommune2Etablissement libelleCommuneEtranger2Etablissement distributionSpeciale2Etablissement codeCommune2Etablissement codeCedex2Etablissement libelleCedex2Etablissement codePaysEtranger2Etablissement libellePaysEtranger2Etablissement dateDebut etatAdministratifEtablissement enseigne1Etablissement enseigne2Etablissement enseigne3Etablissement denominationUsuelleEtablissement activitePrincipaleEtablissement nomenclatureActivitePrincipaleEtablissement caractereEmployeurEtablissement longitude latitude geo_score geo_type geo_adresse geo_id geo_ligne geo_l4 geo_l5 Code
7250186 116 7.250186e+11 O 2005-01-01 NN NA 2010-04-18T03:00:27 false 4 POLE DE LA VIANDE RUE SALVADOR ALLENDE 42350 LA TALAUDIERE NA 42305 NA NA NA NA NA NA NA NA NA NA NA NA 2008-11-30 F 43.32C NAFRev2 O 4.421483 45.46871 0.91 street Rue Salvador Allende 42350 La Talaudière 42305_0425_4065b3 G RUE SALVADOR ALLENDE 43.3
15551393 26 1.555139e+12 O 1981-06-18 NA false 3 39 RUE DES ACIERIES 42000 SAINT ETIENNE NA 42218 NA NA NA NA NA NA NA NA NA NA NA NA 1992-12-25 F 15.6A NAF1993 N 4.391282 45.45520 0.94 housenumber 39 Rue des Aciéries 42000 Saint-Étienne ADRNIVX_0000000358718606 G 39 RUE DES ACIERIES 15.6

Enfin, nous allons filtrer nos données afin de ne garder que les commerces. Puisque la table “APE_type” contient l’ensemble des codes que nous souhaitons garder, nous allons créer un filtre afin de ne garder que les lignes de “data42” ayant ces mêmes codes. Les données restantes seront stockées dans une nouvelle table. Enfin, nous allons ajouter l’intitulé des codes à cette nouvelle table, issus de la table “APE_type”, via une jointure attributaire.

alim42 = filter(data42, data42$Code %in% APE_type$Code)
data42_alim = merge(alim42, APE_type, by=c("Code", "Code"))
Nouvelle table jointe aggrémentée des intitulés APE
Code siren nic siret statutDiffusionEtablissement dateCreationEtablissement trancheEffectifsEtablissement anneeEffectifsEtablissement activitePrincipaleRegistreMetiersEtablissement dateDernierTraitementEtablissement etablissementSiege nombrePeriodesEtablissement complementAdresseEtablissement numeroVoieEtablissement indiceRepetitionEtablissement typeVoieEtablissement libelleVoieEtablissement codePostalEtablissement libelleCommuneEtablissement libelleCommuneEtrangerEtablissement distributionSpecialeEtablissement codeCommuneEtablissement codeCedexEtablissement libelleCedexEtablissement codePaysEtrangerEtablissement libellePaysEtrangerEtablissement complementAdresse2Etablissement numeroVoie2Etablissement indiceRepetition2Etablissement typeVoie2Etablissement libelleVoie2Etablissement codePostal2Etablissement libelleCommune2Etablissement libelleCommuneEtranger2Etablissement distributionSpeciale2Etablissement codeCommune2Etablissement codeCedex2Etablissement libelleCedex2Etablissement codePaysEtranger2Etablissement libellePaysEtranger2Etablissement dateDebut etatAdministratifEtablissement enseigne1Etablissement enseigne2Etablissement enseigne3Etablissement denominationUsuelleEtablissement activitePrincipaleEtablissement nomenclatureActivitePrincipaleEtablissement caractereEmployeurEtablissement longitude latitude geo_score geo_type geo_adresse geo_id geo_ligne geo_l4 geo_l5 Type TypeAbreg
10.1 329460323 10 3.294603e+13 O 1984-02-01 NN NA 2013-02-01T10:15:29 false 4 3 MTE DE VOURLAT 42000 SAINT ETIENNE NA 42218 NA NA NA NA NA NA NA NA NA NA NA NA 2013-01-10 F 10.11Z NAFRev2 N 4.381239 45.45818 0.77 housenumber 3 Montée de Vourlat 42000 Saint-Étienne ADRNIVX_0000000279696208 G 3 MONTEE DE VOURLAT Transformation et conservation de la viande et préparation de produits à base de viande viande
10.1 449906049 35 4.499060e+13 O 2012-05-01 NA 2012-09-23T05:18:32 true 2 6 RUE LEON PORTIER 42610 SAINT ROMAIN LE PUY NA 42285 NA NA NA NA NA NA NA NA NA NA NA NA 2012-08-31 F 10.11Z NAFRev2 N 4.122186 45.55606 0.91 housenumber 6 Rue Léon Portier 42610 Saint-Romain-le-Puy ADRNIVX_0000000279625565 G 6 RUE LEON PORTIER Transformation et conservation de la viande et préparation de produits à base de viande viande

Statistiques et classements des communes

Grâce à ce filtre et à ces nouveaux intitulés, nous pouvons maintenant effectuer de nouvelles analyses. Par exemple, nous allons calculer le nombre de commerces par commune, puis classer les classer en fonction du résultat. Pour cela, nous allons utiliser des fonctions de résumé, qui permet en particulier de regrouper les données en fonction de valeurs communes dans une colonne. Elle permet aussi d’effectuer un calcul sur la colonne qui fait l’objet du “regroupement”. Ici, nous allons grouper les données en fonction de la commune, donc “libelleCommuneEtablissement”, puis effectuer la somme des lignes regroupées dans chaque commune (puisque 1 ligne = 1 commerce dans nos données).

commerce_commune = summarise(group_by(data42_alim, libelleCommuneEtablissement), somme_ali=n(), .groups="drop")

Les communes comptant le plus de commerces dans le 42 sont donc :

libelleCommuneEtablissement somme_ali
SAINT ETIENNE 3819
ROANNE 919
SAINT CHAMOND 536

Ce résultat n’est guère suprenant puisqu’il s’agit de communes importantes.

Il est également intéressant de considérer la question opposée, puisque certaines petites communes ne comportent que très peu de commerces. Parmi celles-ci, certaines n’en comptent-elles qu’un seul ? De quel type est-il ? Pour effectuer cette analyse, plusieurs opérations successives sont nécessaires. D’abord, il faut utiliser la fonction de résumé décrite précédemment, afin de regrouper à nouveau les commerces par commune d’appartenance, et effectuer leur total respectif. Puisque nous voulons également obtenir la catégorie de l’unique commerce, il ne faut pas oublier d’inclure “TypeAbreg” dans les colonnes à inclure dans le résumé.

nb_type = filter(summarise(group_by(data42_alim, libelleCommuneEtablissement), sum_mag=n(), TypeAbreg, .groups="drop"), sum_mag==1)

Dans un second temps, la résumé effectué va être filtré afin de ne garder que les communes ne comptant qu’un seul commerce. Pour cela, le filtre va interroger le total de commerces par commune calculé lors du résumé, et lui indiquer que l’on ne souhaite garder que les lignes ayant 1 pour résultat. Les communes avec un seul commerce ainsi que leur type sont donc :

libelleCommuneEtablissement sum_mag TypeAbreg
BOYER 1 bar
CEZAY 1 magasinSpecialise
DEBATS RIVIERE D’ORPRA 1 autres
GREZIEUX LE FROMENTAL 1 restau
JARNOSSE 1 restau
LA CHAPELLE EN LAFAYE 1 restau
LURE 1 viande
PINAY 1 restau
ROCHE 1 boulPatiss
SAINT LAURENT ROCHEFORT 1 traiteur
SAINT PIERRE LA NOAILLE 1 restau
SAINT PRIEST LA VETRE 1 magasinSpecialise
SAINT SIXTE 1 bar
SAINT THOMAS LA GARDE 1 viande
SAINTE AGATHE EN DONZY 1 bar
SOUTERNON 1 viande
URBISE 1 bar

Au total, si l’on additionne le nombre d’établissements présents dans les communes à commerce unique, il s’avère que les catégories les plus représentées sont les restaurants et les bars.

TypeAbreg total
autres 1
bar 4
boulPatiss 1
magasinSpecialise 2
restau 5
traiteur 1
viande 3

Il est également possible d’analyser les données à travers plusieurs filtres successifs. Par exemple, nous allons chercher à afficher les communes ayant plus de 100 commerces et au moins 10 commerces consacrés à la viande parmi ceux-ci. Pour cela, nous allons construire une chaîne qui comprend le groupement des commerces par communes, le filtre n’incluant que les communes ayant un total de commerces supérieur à 100, et un second filtre permettant de n’inclure que les commerces de type “viande”. La chaîne se poursuit avec l’utilisation de la fonction “résumé”, qui se charge une nouvelle fois de regrouper les données restantes (les commerces de viande uniquement) par commune en calculant le total d’établissements regroupés, et une dernière fonction de filtre permet de ne garder que les communes ayant un total de 10 commerces de viande, ou plus.

cent_mag = data42_alim %>%
  group_by(libelleCommuneEtablissement) %>%
  filter(n()>100, TypeAbreg=="viande") %>%
  summarise(sum_viande=n()) %>%
  filter(sum_viande>10)

Le résultat de cette manipulation nous donne cinq communes uniquement - des communes assez importantes ce qui donne une sens à ce résultat.

libelleCommuneEtablissement sum_viande
FEURS 13
LA TALAUDIERE 12
MONTBRISON 19
ROANNE 13
SAINT ETIENNE 24

2. Automatisation sur plusieurs départements de la région

Nous allons maintenant automatiser nos opérations précédentes sur plusieurs départements de la région Auvergne-Rhône-Alpes. Pour cela, nous allons procéder en plusieurs étapes. Tout d’abord, il nous faudra nettoyer les données de la même manière que lors de la partie précédente, grâce à une fonction itérée pour tous les départements. Ensuite, dans cette même itération, nous regrouperons les données des commerces de chaque département dans un fichier unique et modifierons diverses données afin d’obtenir un fichier global suivant la même forme que nos données du département 42.

Nettoyage des données

Dans un premier temps, nous allons donc créer une fonction permettant de nettoyer les données de n’importe quel département. La fonction est donc découpée en plusieurs étapes. D’abord, une ligne permet d’introduire le fichier CSV des données en fonction d’un numéro en entrée qui s’ajoute dans le nom du fichier à rechercher dans le répertoire via la fonction “paste0” (le 0 supprimant les espaces superflus). La ligne suivante se charge de lire les données ; la suivante découpe le code d’activité afin de le faire correspondre, dans la ligne du dessous, aux codes présents dans “APE_type”, les données étant mises en relation grâce à un filtre. Ensuite, la fonction vient effectuer une jointure attributaire afin d’ajouter les intitulés APE, et une dernière ligne prend soin de transformer les chiffres (en particulier les codes postaux) en chaînes de caractères, afin d’éviter les bugs par la suite à cause d’une lecture erronnée de la part de RStudio.

get_clean_data <- function(num_dpt){
  data = paste0("geo_siret_",num_dpt, ".csv")
  data_dpt = readr::read_csv(data)
  data_dpt$Code = str_sub(data_dpt$activitePrincipaleEtablissement,start=1,end=4)
  alim = filter(data_dpt, data_dpt$Code %in% APE_type$Code)
  data_alim = merge(alim, APE_type, by=c("Code", "Code"))
  data_alim = data.frame(lapply(data_alim, as.character), stringsAsFactor=FALSE)
}

Création d’une boucle pour classifier tous les commerces et export conditionnel du fichier

Nous allons ensuite utiliser cette fonction au sein d’une boucle, permettant de traiter tous les départements qui nous intéressent à la fois. Lors de cette boucle, nous avons également inclus un test de routine, permettant de vérifier si le fichier complet existe déjà dans le répertoire (dans le cas d’utilisations répétées du code). Si le fichier n’existe pas, alors la fonction sera utilisée pour chacun des départements dont les noms sont contenus dans une liste établie au préalable. L’actionnement de cette fonction et de la liste est permise par la fonctionnalité “map” de la librairie “purrr”. Une fois le fichier complet créé et combiné avec “bind_rows”, quelques modifications supplémentaires y seront appliquées. D’abord, une colonne comprenant le numéro du département de chaque commerce est créé à partir de la colonne contenant les codes postaux. Il suffit de ne conserver que leurs deux premiers caractères pour obtenir le résultat voulu. Ensuite, une nouvelle transformation des données numériques en données textuelles est effectuée, même si celle-ci est déjà comprise dans la fonction, afin de modifier la nouvelle colonne en particulier. Enfin, le fichier créé est enregistré dans le répertoire.

library(purrr)
list_dpt = c("01", "38", "42", "43", "69")
if(file.exists("alimRA_entr.csv")){
  alimRA_entr = readr::read_csv("alimRA_entr.csv")
  }else{
  alimRA_entr = purrr::map(list_dpt, get_clean_data)
  alimRA_entr = dplyr::bind_rows(alimRA_entr)
  alimRA_entr$Dept = str_sub(alimRA_entr$codePostalEtablissement,start=1,end=2)
  alimRA_entr = data.frame(lapply(alimRA_entr, as.character), stringsAsFactor=FALSE)
  write.csv(alimRA_entr,"alimRA_entr.csv")
  }

3. Statistiques générales sur tous les départements

Maintenant que nous avons un fichier complet, nous pouvons effectuer plusieurs analyses propertionnelles et comparatives.

Agrégation des données par commune et type de commerce

Nous allons ici, par exemple, calculer la proportion de chaque type de commerce par commune. Pour cela, plusieurs étapes sont nécessaires. D’abord, nous allons calculer le nombre de commerces par type et par commune (nInTypeCom), ainsi que le nombre de commerces par commune en parallèle (nInCom), toutes les deux via un résumé qui regroupera les catégories voulues et effectuera le total de celles-ci. Ensuite, les deux tables créées sont jointes par un “left_join” en fonction du nom des communes, afin de rassembler les différents totaux créés. Dans cette nouvelle table, une nouvelle colonne correspondant à la proportion de chaque type de commerce dans chaque commune est créée et calculée. Le résultat est visible dans le tableau ci dessous :

#Nombre de commerces par type et par commune
alimRA_InType = summarise(group_by(alimRA_entr, libelleCommuneEtablissement, TypeAbreg), nInTypeCom=n(), .groups="drop")
#Nombre de commerces par commune
alimRA_InCom = summarise(group_by(alimRA_entr, libelleCommuneEtablissement), nInCom=n(), .groups="drop")
#Jointure des deux tables
alimRA_typeCom = left_join(alimRA_InCom, alimRA_InType, by = "libelleCommuneEtablissement")
#Création d'une colonne de proportions
alimRA_typeCom$propInTypeCom = (alimRA_typeCom$nInTypeCom/alimRA_typeCom$nInCom)*100
Proportions de commerces par type et par commune
libelleCommuneEtablissement nInCom TypeAbreg nInTypeCom propInTypeCom
ABOEN 5 bar 3 60.000000
ABOEN 5 restau 1 20.000000
ABOEN 5 supermarche 1 20.000000
AFFOUX 2 restau 2 100.000000
AGNIN 14 boulPatiss 1 7.142857

Nous pouvons ensuite lancer un filtre, pour par exemple récupérer les communes ayant plus de 100 commerces et dont 5% d’entre eux sont des commerces de viande. Pour cela, une chaîne permet de regrouper les commerces par commune, puis de filtrer les données par leur nombre total de commerces et leur proprotion d’établissements de type “viande”.

commerce_viande = alimRA_typeCom %>%
  group_by(libelleCommuneEtablissement) %>%
  filter(nInCom>100, TypeAbreg=="viande", propInTypeCom>5)

Au final, les communes concernées par ces filtres sont les suivantes :

libelleCommuneEtablissement nInCom TypeAbreg nInTypeCom propInTypeCom
CHARLIEU 165 viande 9 5.454546
CORBAS 155 viande 15 9.677419
FEURS 217 viande 13 5.990783
LA TALAUDIERE 151 viande 12 7.947020
MONTBRISON 359 viande 19 5.292479
YSSINGEAUX 177 viande 15 8.474576

Proportions des commerces par type à Lyon 4e et

Afin d’offrir une meilleure compréhension de nos analyses, nous allons maintenant visualiser nos données. Dans un premier temps, des graphiques peuvent être suffisants afin de représenter et comparer les proportions calculées précédemment. Le graphique ci-dessous représente donc les proprotions de chaque type de commerce en comparant les “communes” de Lyon 4 et Lyon 8.

lyon = c("LYON 4EME", "LYON 8EME")
alim_lyon = filter(alimRA_typeCom, libelleCommuneEtablissement==lyon)

Pour réaliser ce graphique, nous avons utilisé ggplot2 et son graphique “geom_point”. Nous avions au préalable utilisé un filtre afin de ne garder, dans une nouvelle table, que les deux communes nous intéressant (inscrites dans une liste). Il apparaît donc que dans les deux cas, les restaurants occupent la part la plus importante des commerces avec plus de 40% de représentation, une part légérement plus importante à Lyon 8. D’autres commerces, en revanche, varient de manière plus marquée. On trouve ainsi plus de traiteurs à Lyon 8 qu’à Lyon 4. Pour les autres commerces, leur part est si similaire que leurs points sont superposés.

Evolution du paysage commercial de la région

A présent, nous allons réaliser une analyse temporelle de nos données. En effet, nous disposons d’une variable décrivant l’année de création de chaque commerce.

Classement des commerces par année de création

Nous pouvons donc classer les commerces par année de création, par exemple. Pour cela, il nous faut d’abord créer une variable plus exploitable que les dates précises en DD/MM/YYYY fournies dans les données. La librairie “Lubridate” est utile dans ce cas de figure : elle nous permet de convertir nos données en format de “date” YYYY/MM/DD (celles-ci étant précédemment en chaine de caractères), et de récupérer la partie “YYYY” uniquement. Ainsi, nous pouvons créer une nouvelle colonne contenant l’année de création.

alimRA_entr$dateCreationEtablissement = ymd(alimRA_entr$dateCreationEtablissement)
alimRA_entr$annee = year(alimRA_entr$dateCreationEtablissement)

Par la suite, il s’agit d’effectuer plusieurs résumés permettant de calculer les totaux de créations d’entreprises par type et par année (nInTypeAn), ansi qu’un total général par année (nInAn). Comme précédemment, ces deux tables provisoires sont jointes afin de regrouper toutes les indicateurs. Nous pouvons ensuite utiliser un filtre sur cette nouvelle classification, nous permettant d’exclure tous les commerces ayant été créés avant 1970.

type_annee = summarise(group_by(alimRA_entr, annee, TypeAbreg), nInTypeAn=n(), .groups="drop")
nb_annee = summarise(group_by(alimRA_entr, annee), nInAn=n(), .groups="drop")
alimRA_typeAn = left_join(type_annee, nb_annee, by = "annee")
alimRA_typeAn = filter(alimRA_typeAn, annee >=1970)

Nous pouvons ici avoir un aperçu du résultat de cette classification et du filtre :

Commerces fondés post-1970’s
annee TypeAbreg nInTypeAn nInAn
1970 bar 8 20
1970 boulPatiss 3 20
1970 magasinSpecialise 1 20
1970 restau 4 20
1970 supermarche 3 20

Evolution de la proportion d’entreprises par type et par année

Une représentation temporelle des données précédemment éditées est donc possible, toujours avec ggplot. Dans un premier graphe, nous souhaitons représenter l’évolution de la proportion d’entreprises créées par année et par type (toutes communes comprises). Pour une telle représentation, nous avons choisi de compiler deux graphiques : des points et des lignes afin d’accentuer les variations.

alimRA_typeAn$prop = (alimRA_typeAn$nInTypeAn*100)/alimRA_typeAn$nInAn

Ce graphique apparaît peu clair ; nous allons l’alléger en ne gardant que les cinq types de commerces prévalents. Pour cela, nous allons créer une chaîne qui va résumer les données par type de commerce, faire le total de création par type (toutes années confondues) à partir de l’indicateur du total par année créé précédemment, classer les données résultantes par ordre décroissant, et tronquer les données pour ne garder que les cinq premières entités.

Il a ensuite suffit de stocker la colonne contenant les noms des catégories du “top 5” dans une liste. Celle-ci servira ensuite de référence pour le filtre permettant de n’inclure que les commerces correspondant aux catégories à représenter.

top5 <- summarise(group_by(alimRA_typeAn, TypeAbreg), total=sum(nInAn), .groups="drop") %>%
  arrange(desc(total)) %>%
  slice(1:5)
top5 = c(top5$TypeAbreg)
top5plot = filter(alimRA_typeAn, TypeAbreg==top5)

Représentation cartographique des commerces

Dans cette étape finale, nous allons visualiser quelques unes de nos données sous la forme cartographique !

Localisation des boulangeries-pâtisseries

Tout d’abord, nous allons développer une carte de localisation des boulangeries-pâtisseries. Au préalable, quelques modifications ont été nécessaires au sein des données, notamment pour transformer notre table en objet spatial “sf”, et supprimer les lignes n’ayant pas de coordonnées complètes (en repérant les lignes n’ayant le champ “latitude” vide).

alim_sf = alimRA_entr[!is.na(alimRA_entr$latitude), ]
alim_sf = st_as_sf(alim_sf, coords=c("longitude","latitude"), crs=4326, stringsAsFactors = FALSE)

Ensuite, après un filtre pour ne garder que les entités concernant les boulangeries, la librairie “tmap” est utilisée pour cartographier les données. Pour des raisons d’esthétique, le fond de carte est modifié, ainsi que le style des points, leur discrétisation, et le zoom initial ; un titre est également ajouté à la carte.

alim_sf_boul = filter(alim_sf, TypeAbreg=="boulPatiss")
tmap_mode("view")

Proportion des commerces par commune dans la région Auvergne-Rhône-Alpes

Pour finir, nous allons cartographier la proportion des commerces par commune dans toute notre région. Pour cela, l’ajout d’une couche shapefile contenant les polygones des communes Françaises est nécessaire. Afin de faire correspondre les données de cette couche à nos données des commerces, nous devons créer un identifiant commun aux deux fichiers. Nous allons donc éditer le code INSEE présent dans le shapefile, afin de n’en garder que les deux premiers chiffres qui correspondent au numéro du département. Ensuite, la liste utilisée lors de l’itération pour créer la table commune à tous les départements est ici réutilisée dans le cadre d’une sélection attributaire, pour ne garder que les communes concernées par l’étude. Le fichier shapefile est enfin transformé en objet sf (son insertion en tant qu’objet sf ne fonctionnant pas dès le début).

library("rgdal")
library("rgeos")
limites_communes <- readOGR("C:/Users/zcami/Documents/MASTER 2/R_stats/SHAPE_COMMUNE/communes-plus-20140630-100m.shp", "communes-plus-20140630-100m")
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\zcami\Documents\MASTER 2\R_stats\SHAPE_COMMUNE\communes-plus-20140630-100m.shp", layer: "communes-plus-20140630-100m"
## with 36725 features
## It has 17 fields
limites_communes$insee <- str_sub(limites_communes$insee, start=1, end=2)
limites_communes <- limites_communes[limites_communes$insee %in% list_dpt, ]
limites_communes_sf <- st_as_sf(limites_communes, coords, crs=4326)

Par la suite, une jointure spatiale est effectuée entre nos données de commerces et le shapefile des communes, afin de faire correspondre chacun des commerces au polygone de sa commune. A partir de ces nouvelles données, il est possible de calculer le total de commerces par commune (grâce à un résumé regroupant les commerces par communes).

Enfin, la carte du nombre de commerces par commune est réalisable de la même manière que la carte précédente. Les communes mises en avant, avec des taux plus importants, sont sans surprise les communes les plus denses de la région.

nb_type_com <- st_join(limites_communes_sf, alim_sf)
alim_com <- summarise(group_by(nb_type_com, nom), nbCo= n(), .groups="drop")